package com.itheima.window;

public class LeetCode1652 {
    //你有一个炸弹需要拆除，时间紧迫！你的情报员会给你一个长度为 n 的 循环 数组 code 以及一个密钥 k 。
    //
    //为了获得正确的密码，你需要替换掉每一个数字。所有数字会 同时 被替换。
    //
    //如果 k > 0 ，将第 i 个数字用 接下来 k 个数字之和替换。
    //如果 k < 0 ，将第 i 个数字用 之前 k 个数字之和替换。
    //如果 k == 0 ，将第 i 个数字用 0 替换。
    //由于 code 是循环的， code[n-1] 下一个元素是 code[0] ，且 code[0] 前一个元素是 code[n-1] 。
    //
    //给你 循环 数组 code 和整数密钥 k ，请你返回解密后的结果来拆除炸弹！
    //使用O（n）解决
    //思路：O（n）加上题目，第一眼想到滑动窗口，分情况开滑

    public int[] decrypt(int[] code, int k) {
        int sum = 0;
        int n = code.length;
        int password[] = new int[n];

        if (k == 0) {
            return password;
        } else if (k < 0) {
            k = -k;
            for (int i = 0; i < n + k - 1; i++) {
                //构建窗口
                sum += code[i % n];
                if (i < k - 1) {
                    continue;
                }
                password[(i + 1) % n] = sum;
                sum -= code[(i - k + 1) % n];
            }
        } else {
            for (int i = 0; i < n + k; i++) {
                //构建窗口
                sum += code[i % n];
                if (i < k) {
                    continue;
                }
                sum -= code[(i - k) % n];
                password[(i - k) % n] = sum;

            }
        }
        return password;
    }
}
